﻿using DB;
using Microsoft.Win32;
using Models;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;

namespace Elixi_AntdUi
{
    public partial class login : AntdUI.Window
    {

        MainWindow_In MainWindow_In;
        private AntdUI.Window window;
        // 保存登录用户名，供主窗体使用
        public string LoggedInUsername { get; private set; }
        public CurrentUser CurrentUser { get; set; }

        public bool IsEnter = false;
        // 使用 SqlSugarScope 实例
        private readonly SqlSugarScope _db = SqlSugarHelper.Db;


        public login()
        {
            InitializeComponent();

            AutoByNamePsw();
            btn_login.Click += btn_login_Click;
            btn_logoff.Click += btn_logoff_Click;
        }

        private void AutoByNamePsw()
        {
            try
            {

                // 判断 config.CurrentUser 不为 null 且其属性有内容再进行操作
                var config = AppConfig.LoadConfig();
                if (config.CurrentUser != null &&
                    !string.IsNullOrWhiteSpace(config.CurrentUser.UserName) &&
                    !string.IsNullOrWhiteSpace(config.CurrentUser.UserPassword))
                {
                    input_user.Text = config.CurrentUser.UserName;
                    input_password.Text = config.CurrentUser.UserPassword;
                }
                StringBuilder sb = new StringBuilder();
                sb.Append(titlebar.SubText.ToString());
                if (config.AllConfig.IsInOrOut == 0)
                {
                    sb.Append("入库");
                }
                else if (config.AllConfig.IsInOrOut == 1)
                {
                    sb.Append("出库");
                }
                else
                {

                }
                titlebar.SubText = sb.ToString();
            }
            catch (Exception)
            {

                throw;

            }


        }

        /// <summary>
        /// 登录按钮点击事件
        /// </summary>
        private async void btn_login_Click(object sender, EventArgs e)
        {
            // 使用示例
            SimpleSpeaker.Say("登录成功，欢迎使用本系统！");
           
            /*;
            SimpleSpeaker.Failure();*/

            string userName = input_user.Text.Trim();
            string userGuid = input_userguid.Text.Trim();
            string password = input_password.Text.Trim();

            if (string.IsNullOrWhiteSpace(userName) ||
                string.IsNullOrWhiteSpace(password))
            {
                MessageBox.Show("请填写正确的用户信息", "输入错误",
                               MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                if (IsEnter == false)
                {
                    // 执行数据库查询
                    SearchUserByName();

                }

                // 使用 SqlSugar 进行精确查询
                var dbPassword = _db.Queryable<Tb_UsersInfo>()
                    .Where(u => u.UserName == input_user.Text.Trim() && u.GUID == input_userguid.Text.Trim())
                    .Select(u => u.UserPassWord)
                    .First();

                if (!string.IsNullOrWhiteSpace(dbPassword))
                {
                    // 智能密码验证
                    bool isLoginSuccessful = VerifyPassword(dbPassword, input_password.Text);
                    if (isLoginSuccessful)
                    {

                        if (IsMd5Format(input_password.Text))
                        {
                            CurrentUser = new CurrentUser
                            {
                                UserName = input_user.Text.Trim(),
                                UserGuid = input_userguid.Text.Trim(),
                                UserPassword = Md5Encrypt(input_password.Text),
                            };
                        }
                        else
                        {
                            CurrentUser = new CurrentUser
                            {
                                UserName = input_user.Text.Trim(),
                                UserGuid = input_userguid.Text.Trim(),
                                UserPassword = input_password.Text,
                            };
                        }

                        //AppConfig.UpdateCurrentUser(input_user.Text.Trim(), input_userguid.Text.Trim());
                        AppConfig.UpdateCurrentUser(input_user.Text.Trim(), input_userguid.Text.Trim(), input_password.Text.Trim());
                        // 关闭窗体并返回OK
                        DialogResult = DialogResult.OK;
                        this.Close();

                    }
                    else if (!isLoginSuccessful)
                    {
                        if (dbPassword != input_password.Text && dbPassword != Md5Encrypt(input_password.Text))
                        {
                            IsEnter = false;
                            MessageBox.Show("密码错误，请重新输入!", "登录失败",
                                           MessageBoxButtons.OK,
                                           MessageBoxIcon.Warning);
                            input_userguid.Text = "";
                            input_password.Text = "";
                            input_password.Focus();
                            input_password.SelectAll();
                            return;
                        }
                        if (IsMd5Format(input_password.Text))
                        {
                            CurrentUser = new CurrentUser
                            {
                                UserName = input_user.Text.Trim(),
                                UserGuid = input_userguid.Text.Trim(),
                                UserPassword = Md5Encrypt(input_password.Text),
                            };
                        }
                        else
                        {
                            CurrentUser = new CurrentUser
                            {
                                UserName = input_user.Text.Trim(),
                                UserGuid = input_userguid.Text.Trim(),
                                UserPassword = input_password.Text.Trim(),
                            };
                        }
                        
                        //AppConfig.UpdateCurrentUser(input_user.Text.Trim(), input_userguid.Text.Trim());
                        AppConfig.UpdateCurrentUser(input_user.Text.Trim(), input_userguid.Text.Trim(), input_password.Text.Trim());
                        // 关闭窗体并返回OK
                        DialogResult = DialogResult.OK;
                        this.Close();

                    }
                    else if (IsEnter == false)
                    {
                        // 执行数据库查询
                        SearchUserByName();
                        if (dbPassword == password)
                        {

                            // 更新用户对象
                            CurrentUser = new CurrentUser
                            {
                                UserName = input_user.Text.Trim(),
                                UserGuid = input_userguid.Text.Trim(),
                                UserPassword = input_password.Text.Trim(),
                            };
                            LoggedInUsername = input_user.Text.Trim();
                            // 关闭窗体并返回OK
                            DialogResult = DialogResult.OK;
                            Close();
                        }
                        IsEnter = false;
                    }
                    else
                    {
                        IsEnter = false;
                        MessageBox.Show("1密码错误，请重新输入!", "登录失败",
                                       MessageBoxButtons.OK,
                                       MessageBoxIcon.Warning);
                        input_userguid.Text = "";
                        input_password.Text = "";
                        input_password.Focus();
                        input_password.SelectAll();
                    }
                }
                else
                {
                    IsEnter = false;
                    input_userguid.Text = "";
                    input_password.Text = "";
                    MessageBox.Show("2密码错误，请重新输入!", "登录失败:",
                                       MessageBoxButtons.OK,
                                       MessageBoxIcon.Warning);
                    input_password.Focus();
                    input_password.SelectAll();
                }

            }
            catch (Exception ex)
            {

                MessageBox.Show($"登录验证失败: {ex.Message}", "数据库错误",
                               MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 根据用户名搜索用户信息
        /// </summary>
        private void SearchUserByName()
        {
            string userName = input_user.Text.Trim();

            if (string.IsNullOrWhiteSpace(userName))
            {
                MessageBox.Show("请输入用户名进行查询", "输入错误",
                               MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                // 使用 SqlSugar 进行精确查询
                var user = _db.Queryable<Tb_UsersInfo>()
                    .Where(u => u.UserName == userName)
                    .Select(u => new { u.GUID, u.UserName })
                    .First();

                if (user != null)
                {
                    input_userguid.Text = user.GUID;
                    input_user.Text = user.UserName;
                    IsEnter = true;
                    input_password.Focus();
                }
                else
                {
                    IsEnter = false;
                    input_userguid.Text = "";
                    input_password.Text = "";
                    /* MessageBox.Show("未找到匹配的用户", "查询结果",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);*/
                }
            }
            catch (Exception ex)
            {
                input_userguid.Text = "";
                input_password.Text = "";
                MessageBox.Show($"查询用户失败: {ex.Message}", "数据库错误",
                               MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 智能密码验证方法
        /// </summary>
        private bool VerifyPassword(string dbPassword, string inputPassword)
        {
            // 判断数据库密码是否为MD5格式
            if (IsMd5Format(dbPassword))
            {
                if (IsMd5Format(inputPassword))
                {
                    // MD5格式：比较MD5加密后的密码
                    return dbPassword == inputPassword;
                }
                else
                {
                    // MD5格式：比较MD5加密后的密码
                    return dbPassword == Md5Encrypt(inputPassword);
                }
                   
            }
            else if(!IsMd5Format(dbPassword))
            {
                // 非MD5格式：直接比较明文
                return Md5Encrypt(dbPassword) == inputPassword;
            }
            else
            {
                return dbPassword == inputPassword;
            }
        }
        /// <summary>
        /// 计算字符串的MD5加密结果（32位小写）
        /// </summary>
        /// <param name="input">待加密的字符串</param>
        /// <returns>MD5加密后的32位十六进制字符串</returns>
        public static string Md5Encrypt(string input)
        {
            // 处理空输入（视为空字符串）
            input ??= string.Empty;

            // 创建MD5实例
            using (MD5 md5 = MD5.Create())
            {
                // 1. 将字符串转为UTF8字节数组
                byte[] inputBytes = Encoding.UTF8.GetBytes(input);

                // 2. 计算MD5哈希值（得到16字节的哈希结果）
                byte[] hashBytes = md5.ComputeHash(inputBytes);

                // 3. 将哈希字节数组转为32位十六进制字符串
                StringBuilder sb = new StringBuilder();
                foreach (byte b in hashBytes)
                {
                    // 每个字节转为2位十六进制（x2表示小写，X2表示大写）
                    sb.Append(b.ToString("x2"));
                }
                return sb.ToString();
            }
        }

        /// <summary>
        /// 判断字符串是否符合MD5格式（32位十六进制）
        /// </summary>
        private bool IsMd5Format(string input)
        {
            if (string.IsNullOrEmpty(input) || input.Length != 32)
                return false;

            // 检查是否只包含十六进制字符
            foreach (char c in input)
            {
                if (!((c >= '0' && c <= '9') ||
                      (c >= 'a' && c <= 'f') ||
                      (c >= 'A' && c <= 'F')))
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 退出按钮点击事件
        /// </summary>
        private void btn_logoff_Click(object sender, EventArgs e)
        {
            // 使用系统自带的MessageBox，避免AntdUI组件缺失问题
            DialogResult result = MessageBox.Show(
                "确定要退出程序吗？",
                "确认退出",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question
            );

            if (result == DialogResult.Yes)
            {
                // 退出整个应用程序
                System.Windows.Forms.Application.Exit();
            }

        }

        private void AntdUIButton_Click(string text, string mestext)
        {

            switch (text)
            {
                //autoClose: 0 不自动关闭, 单位为秒
                case "Success":
                    AntdUI.Message.success(window, $"{mestext}", autoClose: 3);
                    break;
                case "Error":
                    AntdUI.Message.error(window, $"{mestext}", autoClose: 3);
                    break;
                case "Info":
                    AntdUI.Message.info(window, $"{mestext}", autoClose: 3);
                    break;
                case "Warn":
                    AntdUI.Message.warn(window, $"{mestext}", autoClose: 3);
                    break;
            }
        }

        private void btn_register_Click(object sender, EventArgs e)
        {
            // 创建并显示注册窗口
            RegisterForm registerForm = new RegisterForm();
            if (registerForm.ShowDialog() == DialogResult.OK)
            {
                // 注册成功后，将用户名自动填入登录框
                input_user.Text = registerForm.RegisteredUserName;
                input_password.Text = registerForm.RegisteredUserPsw;
                input_password.Focus();
                MessageBox.Show("注册成功，请使用新账号登录", "注册成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

       
    }

}

